package ace.module.stock.api;

import ace.cmp.core.model.R;
import ace.cmp.sdk.api.SdkApi;
import ace.module.common.api.model.input.TenantAndAppTypeInput;
import ace.module.stock.api.model.dto.WmsStockDto;
import ace.module.stock.api.model.dto.ext.WmsStockDetailDto;
import ace.module.stock.api.model.input.WmsBizInitInput;
import ace.module.stock.api.model.input.WmsStockActionRecordWithBatchSnInput;
import ace.module.stock.api.model.input.WmsStockActionTypeRecordWithBatchSnInput;
import ace.module.stock.api.model.input.WmsStockReverseBatchSnInput;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import java.util.List;

/**
 * 库存 api.
 *
 * @author Caspar
 */
public interface WmsStockApi extends SdkApi<WmsStockDto, Long> {

  /**
   * 库存不存在初始化库存,存在设置库存.
   * 自动计算总库存
   *
   * @return 成功 true / 失败 false
   */
  R<WmsStockDetailDto> initOrSet(@Valid @NotNull TenantAndAppTypeInput<WmsBizInitInput> input);

  /**
   * 库存修改,库存增加、扣减或设置.自动计算总库存
   *
   * @return code 0=成功   data=操作批次流水号=参数的批次流水号
   */
  R<String> modify(TenantAndAppTypeInput<WmsStockActionTypeRecordWithBatchSnInput> input);

  /**
   * 增加库存.
   *
   * @return code 0=成功   data=增加操作记录操作批次流水号
   */
  R<String> add(@Valid @NotNull TenantAndAppTypeInput<WmsStockActionRecordWithBatchSnInput> input);


  /**
   * 扣减库存.
   *
   * @return code 0=成功   data=扣减操作记录操作批次流水号
   */
  R<String> subtract(@Valid @NotNull TenantAndAppTypeInput<WmsStockActionRecordWithBatchSnInput> input);

  /**
   * 回退增加或扣减库存操作.
   *
   * @return code 0=成功   data=回退操作记录操作批次流水号
   */
  R<String> reverse(@Valid @NotNull TenantAndAppTypeInput<WmsStockReverseBatchSnInput> input);


  /**
   * 获取sku库存,根据业务id.
   *
   * @param skuIdInput sku id
   * @return 库存
   */
  R<List<WmsStockDto>> getSkuByObjectIdIn(@Valid @NotNull TenantAndAppTypeInput<List<Long>> skuIdInput);

  /**
   * 获取商品总库存,根据业务id.
   *
   * @param productIdInput 商品 id
   * @return 库存
   */
  R<List<WmsStockDto>> getProductByObjectIdIn(@Valid @NotNull TenantAndAppTypeInput<List<Long>> productIdInput);

}